package morenoapp.components.common;

import java.util.List;
import javax.swing.event.TableModelEvent;
import javax.swing.table.TableCellRenderer;
import morenoapp.model.data.MorenoQuestionFace;

/**
 * Модель таблицы содержащей матрицу данных и вспомогательные столбцы и строки.
 * @author dmitry.mamonov
 */
public abstract class AbstractMatrixTableModel extends AbstractCustomColumnsMorenoTableModel {
    /**
     * Последний запрошеный размер матрицы. Используется для
     * оповещения об изменении количества столбцов
     * при изменении количества трок в матрице.
     */
    private int lastMatrixSize = 0;

    private QuestionsFilter defaultQuestionsFilter = new QuestionsFilter() {
        public List<MorenoQuestionFace> getFilteredQuestionList() {
            return getMorenoModel().getQuestionsList();
        }
    };

    private QuestionsFilter questionsFilter = defaultQuestionsFilter;

    public AbstractMatrixTableModel() {
        super();
    }

    /* abstract methods */
    protected abstract int getMatrixSize();

    protected abstract int getFooterRowsCount();


    /* internal methods */
    public void fireFilterChanged() {
        super.fireTableChanged(new TableModelEvent(this));
    }

    public QuestionsFilter getQuestionsFilter() {
        return questionsFilter != null ? questionsFilter : defaultQuestionsFilter;
    }

    public void setQuestionsFilter(QuestionsFilter questionsFilter) {
        this.questionsFilter = questionsFilter;
    }

    /* TableModel implementation */
    @Override
    protected int getMiddleConlumnsCount() {
        return getMatrixSize();
    }

    public int getRowCount() {
        lastMatrixSize = getMatrixSize();
        return lastMatrixSize + getFooterRowsCount();
    }

    public TableCellRenderer getTableCellRenderer(int _column) {
        return null;
    }

    /* internal behaviour */
    @Override
    protected void fireTableChanged(TableModelEvent e) {
        super.fireTableChanged(e);
        if (lastMatrixSize != getMatrixSize()) {
            //вызываем обповещение только если изменилось количество строк
            super.fireTableChanged(new TableModelEvent(this, TableModelEvent.HEADER_ROW));
        }
    }
}
